package com.itfreer.gis.tansform;

import com.itfreer.utils.geotools.CoordinateTransformUtils;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;

/**
 * 注意:第一次运行前请配置GDAL环境,详情请看gdal文件夹 基于GDAL的tif文件的读写,同时做位置偏移(84坐标系基础上做加密)
 */
public class TifWriteAndRend {

	// 数据比较大写入可能需要几分钟
	public static void main(String[] args) {

		// 文件读取
		String fileName_tif = "D:/shp/tif/LGQ_18.tif";
		// 首先是所有gdal程序都需要的注册语句： 之前的版本还需要加这句话来支持中文路径：
		gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
		gdal.AllRegister();
		// 读取影像
		Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);

		if (hDataset == null) {
			System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
			System.err.println(gdal.GetLastErrorMsg());

			System.exit(1);
		}

		// 影像投影信息
		String projection = hDataset.GetProjection();
		// System.out.println("影像投影信息" + projection);
		// 打开的影像像素、波段等信息
		int numBands = hDataset.GetRasterCount(); // 读取影像波段数
		int xSize = hDataset.GetRasterXSize(); // 栅格尺寸宽
		int ySize = hDataset.GetRasterYSize(); // 栅格尺寸高
		// 获取源图像crs 获取源影像的坐标参考
//		String src_wkt = hDataset.GetProjectionRef();

		int type = hDataset.GetRasterBand(1).GetRasterDataType();

		// 构造投影坐标系统的空间参考(wkt)
//		SpatialReference src_Crs = new SpatialReference(src_wkt);

		// 设置输出图像的坐标
//		SpatialReference oLatLong;
		// 获取该投影坐标系统中的地理坐标系
//		oLatLong = src_Crs.CloneGeogCS();
		// 构造一个从投影坐标系到地理坐标系的转换关系
//		CoordinateTransformation ct = new CoordinateTransformation(src_Crs, oLatLong);

		double[] geoTransform = hDataset.GetGeoTransform();
//		// 图像范围
//		// 东西方向空间分辨率 --->像素宽度
//		double w_src = geoTransform[1];
//		// 南北方向空间分辨率 ---> 像素高度
//		double h_src = geoTransform[5];
//		// x方向旋转角
//		double xRotate = geoTransform[2];
//		// y方向旋转角
//		double yRotate = geoTransform[4];

		// 左上角x坐标,y坐标 ---> 影像 左上角 投影坐标
		double xmin = geoTransform[0];

		double ymax = geoTransform[3];

		// // 右下角 x坐标,y坐标
//		 double xmax = geoTransform[0] + xSize * w_src + ySize * xRotate;
		// double ymin = geoTransform[3] + xSize * yRotate + ySize * h_src;
		//
		// // 左下角 x坐标,y坐标
		// double xmax2 = geoTransform[0];
		// double ymin2 = geoTransform[3] + xSize * yRotate + ySize * h_src;
		//
		// // 右上角 x坐标,y坐标
		// double xmax3 = geoTransform[0] + xSize * w_src + ySize * xRotate;
		// double ymin3 = geoTransform[3];

		// 坐标偏移
		double[] zs = CoordinateTransformUtils.wgs84togcj02(xmin, ymax);
		// double[] yx = CoordinateTransformUtils.wgs84togcj02(xmax, ymin);
		// double[] zx = CoordinateTransformUtils.wgs84togcj02(xmax2, ymin2);
		// double[] ys = CoordinateTransformUtils.wgs84togcj02(xmax3, ymin3);

		// 计算目标影像的左上和右下坐标,即目标影像的仿射变换参数,投影转换为经纬度
		// double a[] = ct.TransformPoint(zs[0], zs[1]);
		// double b[] = ct.TransformPoint(yx[0], yx[1]);
		// double c[] = ct.TransformPoint(zx[0], zx[1]);
		// double d[] = ct.TransformPoint(ys[0], yx[1]);

		// 文件写入
		String writeFileName_tif = "D:/shp/tif/LGQ_02_2.tif";
		Driver driver = gdal.GetDriverByName("GTiff");
		Dataset dataset = driver.Create(writeFileName_tif, xSize, ySize, numBands, type);
		// 设置偏移
		geoTransform[0] = zs[0];
		geoTransform[3] = zs[1];
		dataset.SetGeoTransform(geoTransform);
		dataset.SetProjection(projection);

		dataset.SetMetadataItem("COMPRESSION", "LZW", "IMAGE_STRUCTURE");

		// 存储每一行的数据
		int[] cache = new int[xSize];

		// 波段
		for (int i = 1; i <= numBands; i++) {
			Band band = hDataset.GetRasterBand(i);
			Band newBand = dataset.GetRasterBand(i);
			System.out.println("===========================第" + i + "波段写入开始=====================");
			for (int j = 0; j < ySize; j++) {
				// 读取第j行的数据
				band.ReadRaster(0, j, xSize, 1, cache);
				// 把读取到的数据写入
				newBand.WriteRaster(0, j, xSize, 1, cache);
				newBand.FlushCache();
				cache = new int[xSize];
				System.out.println("第" + j + "行写入成功");
			}
			System.out.println("===========================第" + i + "波段写入完成=====================");
		}

		hDataset.delete();
		dataset.delete();
		gdal.GDALDestroyDriverManager();
		System.out.println("新的tif文件写入成功");

	}
}
